//
// Created by PC on 2023/4/28.
/*
http://www.aisichuang.net/#/main/Competition/TitlePage?id=1594&raceId=1304&stateanswer=false
 2023春季伴学挑战赛06：C++语言
    时间限制: 1000 MS 内存限制: 256 MB
6的倍数
题目描述
兔兔给你一个十进制正整数n,问你可以从n中截取多少个不同的子串(连续的若干字符),使得子串构成的数字是6的倍数。
例如：当n=1234时，有且仅有12和234这两个子串是6的倍数。
两个子串只要开始或结束位置有不同，即使内容一样也认为是不同子串，不用考虑高位0的问题，006也算合格的子串。
输入格式
单个整数：表示输入的数字n
输出格式
单个整数：表示6的倍数的子串数量。
样例 #1
样例输入 #1
1234
样例输出 #1
2
提示
对于 20% 的数据，1≤n≤10^9
对于 50% 的数据，1≤n≤10^100
对于 70% 的数据，1≤n≤10^1000
对于 100% 的数据，1≤n≤10^10^6

 * */
// 6的倍数(包括零) 条件: 2的倍数(最后一位是0或偶数) && 3的倍数(每位相加可被三整数)
// 70分, 通过了7/10的测试点, 最后三个测试点超时(TLE)
#include <iostream>

using namespace std;

int main()
{
    string s = "12012";
    // 输入12012,输出应为6(12,120,12,012,0,12012)
    int count = 0;
    cin>>s;
    for (int i = 0; i < s.size(); ++i)
    {
        // 如果此位是0, 单独一个零也符合要求, 而且这个零也可以当做另一个数的末尾, 还要继续后边的判断
        if (s[i]==0)
            count++;
        // 判断最后一位 如果是偶数 继续判断前边的每位数的和能不能被三整除
        if ((s[i] - '0') % 2 == 0)
        {
//            printf("%c:", s[i]);
            int num=0;
            for (int j = i; j >=0 ; --j)
            {
                num+=s[j]-'0';
                if (num%3==0)
                {count++;}
//                printf("%c ",s[j]);
            }
//            cout<<endl;
        }
    }
    cout<<count;
    return 0;
}
